home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
dsp
/
dsp56k
/
a56-1_0.lha
/
a56-1.0
/
subs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-09
|
3KB
|
167 lines
/*******************************************************
*
* a56 - a DSP56001 assembler
*
* Written by Quinn C. Jensen
* July 1990
* jensenq@npd.novell.com (or jensenq@qcj.icon.com)
*
*******************************************************\
/*
* Copyright (C) 1990, 1991 Quinn C. Jensen
*
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. The author makes no representations
* about the suitability of this software for any purpose. It is
* provided "as is" without express or implied warranty.
*
*/
static char *Copyright = "Copyright (C) 1990, 1991 Quinn C. Jensen";
/*
* subs.c - Some subroutines for the assembler.
*
*/
#include "a56.h"
#define MAX 1024
char *alloc();
FILE *open_read(file)
char *file;
{
FILE *fp;
if(strcmp(file, "-") == 0)
fp = stdin;
else if ((fp = fopen(file, "r")) == NULL) {
perror(file);
exit(1);
}
return(fp);
}
FILE *open_write(file)
char *file;
{
FILE *fp;
if ((fp = fopen(file, "w")) == NULL) {
perror(file);
exit(1);
}
return(fp);
}
FILE *open_append(file)
char *file;
{
FILE *fp;
if ((fp = fopen(file, "a")) == NULL) {
perror(file);
exit(1);
}
return(fp);
}
fatal(c, a1, a2, a3, a4, a5, a6, a7, a8)
char *c, *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
{
fprintf(stderr, c, a1, a2, a3, a4, a5, a6, a7, a8);
exit(1);
}
#define TABS 8
#define MAX_BUF 256
char tabbuf[MAX_BUF], *untabn();
char *untab(s) /* expand tabs in s */
register char *s;
{
return(untabn(s, TABS));
}
char *untabn(s, stops) /* expand tabs in s */
register char *s;
register int stops;
{
char *o = s;
/* copy input string into buffer to scan while input string is modified */
register char *b = tabbuf;
strncpy(b, s, MAX_BUF);
/* iterate until the copy of the input string is depleted */
while(*b) {
if(*b == '\t') {
do
*s = ' ';
while ((++s - o) % stops);
} else {
*s = *b; s++;
}
b++;
}
/* null terminate the resultant string */
*s = '\0';
return(o);
}
char *alloc(size)
int size;
{
char *p = (char *)malloc(size);
if(NOT p)
fatal("alloc: insufficient virtual memory to allocate %d bytes\n",
size);
return(p);
}
#define ascii2n(c) \
((c) >= 'a' ? (c) - 'a' + 10 : ((c) >= 'A' ? (c) - 'A' + 10 : (c) - '0'))
#define valid(c) ((c) >= '0' && (c) <= '9' || \
(c) >= 'A' && (c) <= 'Z' || \
(c) >= 'a' && (c) <= 'z')
strtol(s, p, base)
register char *s, **p;
register int base;
{
register long result = 0;
register int sign = 0;
while(*s == ' ' || *s == '\t')
s++;
if(*s == '-') {
s++;
sign++;
}
while(valid(*s)) {
register int dig = ascii2n(*s);
if(dig >= base)
break;
result *= base;
result += dig;
s++;
}
if(p)
*p = s;
return (sign ? -result : result);
}